package com.cskaoyan.javase.object._6clone.cloneable;

/**
 * Cloneable接口是一个空接口,它的作用是什么呢?
 *
 * 某个类实现了一个空接口,表面看起来没有任何变化,没有得到任何方法
 * 但实际上,某个类实现接口,该类的类型发生了变化:
 *      从原先不是这个接口的子类,变成了子类
 *
 * 于是配合instanceof关键字,就可以做出判断,从而完成不同操作:
 *      用引用 instanceof 空接口
 *      1.如果对象所在类型实现了空接口,那就允许做一些操作
 *      2.如果对象所在类型没有实现了空接口,那就不允许做一些操作,或者做一些其他操作
 *
 * 在Java中,这种空接口,有一个特殊称呼"标记接口",被它标记(实现它)就允许做xx操作,否者就不允许
 *
 * @since 17:34
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        judge(new A());
        judge(new B());
    }

    public static void judge(Object o) throws CloneNotSupportedException {
        if (o instanceof Cloneable) {
            // 引用指向的对象是Cloneable子类对象,所以该对象的类型,实现了空接口Cloneable
            System.out.println("实现了空接口Cloneable,允许做克隆操作!");
            return;
        }
        // 引用指向的对象不是Cloneable子类对象,所以该对象的类型,没有哦实现了空接口Cloneable
        // System.out.println("没有实现空接口Cloneable,抛出异常,禁止做克隆操作!");
        throw new CloneNotSupportedException("没有实现空接口Cloneable,抛出异常,禁止做克隆操作!");
    }
}

class A implements Cloneable {

}
class B{}

interface Cloneable {

}